/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.cip.esymons.tesoreria.bc;

import java.util.Date;
import java.util.List;
import javax.persistence.EntityManager;
import org.cip.esymons.colegiatura.be.Colegiado;
import org.cip.esymons.general.util.Utiles;
import org.cip.esymons.tesoreria.adapters.DeudaCuentaIngreso;
import org.cip.esymons.tesoreria.be.DetPagoAgrupado;
import org.cip.esymons.tesoreria.be.EnumEstadoMovimiento;
import org.cip.esymons.tesoreria.be.EnumPorcentajeOMoneda;
import org.cip.esymons.tesoreria.be.EnumTipoDescuento;
import org.cip.esymons.tesoreria.be.EnumTipoGeneracionExoneracion;
import org.cip.esymons.tesoreria.be.ExoneracionDescuento;
import org.cip.esymons.tesoreria.be.MovimientoCuenta;
import org.cip.esymons.tesoreria.be.MovimientoExoneradescuento;

/**
 *
 * @author Gilmar Montoya
 */
public class DescuentoPagoAnual extends DecoradorDescuento {

    private ConfiguracionDescuentoFacadeLocal configuracionDescuentoFacadeLocal;
    private DeudaCuentaIngreso deudaCuentaIngreso;
    private int anioDescuento;

    @Override
    public ExoneracionDescuento generarDescuento(EntityManager em, List<MovimientoCuenta> listaMovimientos, Colegiado colegiado, Double descuento, EnumPorcentajeOMoneda enumPorcentajeOMoneda, EnumTipoDescuento enumTipoDescuento, String desc, Date fechaIni, Date fechaFin, EnumTipoGeneracionExoneracion enumTipoGeneracionExoneracion) {
        descuento = configuracionDescuentoFacadeLocal.conseguirDescuento(new Date());
        if (descuento.compareTo(0D) > 0) {
            ExoneracionDescuento exoneracionDescuento = getDescuentoInterfaz().generarDescuento(em, null, colegiado, descuento, enumPorcentajeOMoneda, enumTipoDescuento, desc, fechaIni, fechaFin, enumTipoGeneracionExoneracion);
            generarDetalle(em, descuento, exoneracionDescuento);
            return exoneracionDescuento;
        }
        return null;
    }

    public void generarDetalle(EntityManager em, Double descuento, ExoneracionDescuento exoneracionDescuento) {
        descuento = 100 - descuento;
        for (DetPagoAgrupado dpci : deudaCuentaIngreso.getListaDeudaxIngreso()) {
            for (MovimientoCuenta mc : dpci.getListaMovimientos()) {
                if (mc.getFkCinCodigo() != null) {
                    if (mc.getFkCinCodigo().isAfectoDescuentoPagoAnual()) {
                        MovimientoExoneradescuento movimientoExoneradescuento = new MovimientoExoneradescuento();
                        movimientoExoneradescuento.setExoneracionDescuento(exoneracionDescuento);
                        movimientoExoneradescuento.setMedMontodescuento(Utiles.redondearDouble(descuento * mc.getMcuMonto(), 2));
                        movimientoExoneradescuento.setMovimientoCuenta(mc);
                        em.persist(movimientoExoneradescuento);
                        mc.setMcuMonto(Utiles.redondearDouble((100 - descuento) * mc.getMcuMonto(), 2));
                        mc.setMcuSaldo(mc.getMcuMonto());
                        if (mc.getMcuMonto() <= 0) {
                            mc.setEstado(EnumEstadoMovimiento.Exonerada);
                        }
                        em.merge(mc);
                    }
                }
            }
        }
    }

    public void aplicarDescuento() {
        Double descuento = configuracionDescuentoFacadeLocal.conseguirDescuento(new Date());
        Double subSuma = 0D;

        if (descuento.compareTo(0D) > 0) {
            descuento = descuento / 100;            
            for (DetPagoAgrupado dpci : deudaCuentaIngreso.getListaDeudaxIngreso()) {
                subSuma = 0D;
                for (MovimientoCuenta mc : dpci.getListaMovimientos()) {
                    if (mc.getFkCinCodigo().isAfectoDescuentoPagoAnual() && mc.getMcuAnio() == anioDescuento) {
                        subSuma += (1 - descuento) * mc.getMcuSaldo();
                    } else {
                        subSuma += mc.getMcuSaldo();
                    }
                }                
                dpci.setValorModificable(Utiles.redondearDouble(subSuma,2));
            }
        }
    }

    public DeudaCuentaIngreso getDeudaCuentaIngreso() {
        return deudaCuentaIngreso;
    }

    public void setDeudaCuentaIngreso(DeudaCuentaIngreso deudaCuentaIngreso) {
        this.deudaCuentaIngreso = deudaCuentaIngreso;
    }

    /**
     * @return the configuracionDescuentoFacadeLocal
     */
    public ConfiguracionDescuentoFacadeLocal getConfiguracionDescuentoFacadeLocal() {
        return configuracionDescuentoFacadeLocal;
    }

    /**
     * @param configuracionDescuentoFacadeLocal the configuracionDescuentoFacadeLocal to set
     */
    public void setConfiguracionDescuentoFacadeLocal(ConfiguracionDescuentoFacadeLocal configuracionDescuentoFacadeLocal) {
        this.configuracionDescuentoFacadeLocal = configuracionDescuentoFacadeLocal;
    }

    /**
     * @return the anioDescuento
     */
    public int getAnioDescuento() {
        return anioDescuento;
    }

    /**
     * @param anioDescuento the anioDescuento to set
     */
    public void setAnioDescuento(int anioDescuento) {
        this.anioDescuento = anioDescuento;
    }
}
